Sajátítsa el az e-mail automatizálást a Python imaplib segítségével. Ez a részletes útmutató bemutatja az IMAP szerverekhez való csatlakozást, a keresést, az e-mailek lekérését, elemzését, a csatolmányok kezelését és a postafiókok profi szintű menedzselését.
Python IMAP Kliens: Átfogó Útmutató az E-mailek Lekéréséhez és a Postafiók Kezeléséhez
Az e-mail továbbra is a digitális kommunikáció egyik sarokköve a vállalkozások és magánszemélyek számára világszerte. A nagy mennyiségű e-mail kezelése azonban időigényes és ismétlődő feladat lehet. A számlák feldolgozásától és az értesítések szűrésétől a fontos beszélgetések archiválásáig a manuális erőfeszítés gyorsan túlterhelővé válhat. Itt jön képbe a programozott automatizálás, és a Python, gazdag standard könyvtárával, hatékony eszközöket biztosít a beérkező levelek feletti irányítás átvételéhez.
Ez az átfogó útmutató végigvezeti Önt egy Python IMAP kliens nulláról történő felépítésének folyamatán a beépített imaplib
könyvtár segítségével. Megtanulja nemcsak azt, hogyan kérjen le e-maileket, hanem azt is, hogyan elemezze tartalmukat, töltsön le csatolmányokat, és kezelje postafiókját az üzenetek olvasottként való megjelölésével, áthelyezésével vagy törlésével. A cikk végére fel lesz vértezve a legfárasztóbb e-mail feladatainak automatizálásához, amivel időt takaríthat meg és növelheti termelékenységét.
A Protokollok Megértése: IMAP vs. POP3 vs. SMTP
Mielőtt belevágnánk a kódolásba, elengedhetetlen megérteni az e-maileket szabályozó alapvető protokollokat. Gyakran hallhat három betűszót: SMTP, POP3 és IMAP. Mindegyik külön célt szolgál.
- SMTP (Simple Mail Transfer Protocol): Ez az e-mailek küldésére szolgáló protokoll. Gondoljon az SMTP-re úgy, mint egy postai szolgáltatásra, amely felveszi a levelét és kézbesíti a címzett postafiók-szerverére. Amikor a Python szkriptje e-mailt küld, SMTP-t használ.
- POP3 (Post Office Protocol 3): Ez az e-mailek lekérésére szolgáló protokoll. A POP3 arra lett tervezve, hogy csatlakozzon egy szerverhez, letöltse az összes új üzenetet a helyi kliensre, majd alapértelmezés szerint törölje őket a szerverről. Olyan, mintha elmenne a postára, begyűjtené az összes levelét, és hazavinné; amint otthon van, már nincs a postán. Ez a modell ma már kevésbé elterjedt a többeszközös világban rejlő korlátai miatt.
- IMAP (Internet Message Access Protocol): Ez a modern protokoll az e-mailek elérésére és kezelésére. A POP3-mal ellentétben az IMAP az üzeneteket a szerveren hagyja, és szinkronizálja az állapotot (olvasott, olvasatlan, megjelölt, törölt) az összes csatlakoztatott kliens között. Amikor elolvas egy e-mailt a telefonján, az a laptopján is olvasottként jelenik meg. Ez a szerver-központú modell tökéletes az automatizáláshoz, mert a szkriptje egy másik kliensként tud interakcióba lépni a postafiókkal, és az általa végrehajtott változások mindenhol tükröződni fognak. Ebben az útmutatóban kizárólag az IMAP-ra fogunk összpontosítani.
Első Lépések a Python imaplib
Könyvtárával
A Python standard könyvtára tartalmazza az imaplib
modult, amely minden szükséges eszközt biztosít egy IMAP szerverrel való kommunikációhoz. Nincs szükség külső csomagokra az elinduláshoz.
Előfeltételek
- Telepített Python: Győződjön meg róla, hogy a Python egy friss verziója (3.6 vagy újabb) telepítve van a rendszerén.
- E-mail fiók engedélyezett IMAP-pal: A legtöbb modern e-mail szolgáltató (Gmail, Outlook, Yahoo stb.) támogatja az IMAP-ot. Lehet, hogy engedélyeznie kell a fiókja beállításaiban.
Biztonság Mindenekelőtt: Használjon Alkalmazásjelszavakat, Ne a Fő Jelszavát
Ez a legkritikusabb biztonsági lépés. Ne írja bele a fő e-mail fiókjának jelszavát közvetlenül a szkriptbe. Ha a kódja valaha is kompromittálódik, az egész fiókja veszélybe kerül. A legtöbb nagy e-mail szolgáltató, amely Kétfaktoros Hitelesítést (2FA) használ, megköveteli egy „Alkalmazásjelszó” generálását.
Az Alkalmazásjelszó egy egyedi, 16 számjegyű jelkód, amely egy adott alkalmazásnak engedélyt ad a fiókjához való hozzáféréshez anélkül, hogy szüksége lenne az elsődleges jelszavára vagy a 2FA kódokra. Bármikor generálhat egyet és visszavonhatja anélkül, hogy ez befolyásolná a fő jelszavát.
- Gmail esetén: Lépjen a Google Fiók beállításai -> Biztonság -> Kétlépcsős azonosítás -> Alkalmazásjelszavak menüpontba.
- Outlook/Microsoft esetén: Lépjen a Microsoft Fiók biztonsági irányítópultjára -> Speciális biztonsági beállítások -> Alkalmazásjelszavak.
- Más szolgáltatók esetén: Keressen a dokumentációjukban az „alkalmazásjelszó” vagy „alkalmazás-specifikus jelszó” kifejezésre.
Miután legenerálta, kezelje ezt az Alkalmazásjelszót, mint bármely más hitelesítő adatot. A legjobb gyakorlat az, hogy környezeti változóban vagy egy biztonságos titokkezelő rendszerben tárolja, nem pedig közvetlenül a forráskódban.
Az Alapvető Csatlakozás
Írjuk meg az első kódrészletünket, hogy biztonságos kapcsolatot létesítsünk egy IMAP szerverrel, bejelentkezzünk, majd szabályosan kijelentkezzünk. Az imaplib.IMAP4_SSL
-t fogjuk használni, hogy biztosítsuk a kapcsolat titkosítását.
import imaplib
import os
# --- Credentials ---
# It's best to load these from environment variables or a config file
# For this example, we'll define them here. Replace with your details.
EMAIL_ACCOUNT = "your_email@example.com"
APP_PASSWORD = "your_16_digit_app_password"
IMAP_SERVER = "imap.example.com" # e.g., "imap.gmail.com"
# --- Connect to the IMAP server ---
# We use a try...finally block to ensure we logout gracefully
conn = None
try:
# Connect using SSL for a secure connection
conn = imaplib.IMAP4_SSL(IMAP_SERVER)
# Login to the account
status, messages = conn.login(EMAIL_ACCOUNT, APP_PASSWORD)
if status == 'OK':
print("Successfully logged in!")
# We will add more logic here later
else:
print(f"Login failed: {messages}")
finally:
if conn:
# Always logout and close the connection
conn.logout()
print("Logged out and connection closed.")
Ez a szkript megteremti az alapot. A try...finally
blokk kulcsfontosságú, mert garantálja, hogy a conn.logout()
meghívásra kerül, lezárva a munkamenetet a szerverrel, még akkor is, ha hiba történik a műveleteink során.
Navigáció a Postafiókban
Miután bejelentkezett, elkezdhet interakcióba lépni a fiókjában lévő postafiókokkal (gyakran mappáknak nevezik).
Az Összes Postafiók Listázása
Ahhoz, hogy megnézze, milyen postafiókok érhetők el, használhatja a conn.list()
metódust. A kimenet kissé rendezetlen lehet, ezért egy kis elemzésre van szükség a nevek tiszta listájának megszerzéséhez.
# Inside the 'try' block after a successful login:
status, mailbox_list = conn.list()
if status == 'OK':
print("Available Mailboxes:")
for mailbox in mailbox_list:
# The raw mailbox entry is a byte string that needs decoding
# It's often formatted like: (\HasNoChildren) "/" "INBOX"
# We can do some basic parsing to clean it up
parts = mailbox.decode().split(' "/" ')
if len(parts) == 2:
mailbox_name = parts[1].strip('"')
print(f"- {mailbox_name}")
Ez egy olyan listát fog kiírni, mint 'INBOX', 'Sent', '[Gmail]/Spam' stb., az e-mail szolgáltatójától függően.
Postafiók Kiválasztása
Mielőtt keresni vagy lekérni tudna e-maileket, ki kell választania egy postafiókot, amellyel dolgozni szeretne. A leggyakoribb választás az 'INBOX'. A conn.select()
metódus aktívvá tesz egy postafiókot. Megnyithatja csak olvasható módban is, ha nem áll szándékában változtatásokat végrehajtani (például az e-mailek olvasottként való megjelölése).
# Select the 'INBOX' to work with.
# Use readonly=True if you don't want to change email flags (e.g., from UNSEEN to SEEN)
status, messages = conn.select('INBOX', readonly=False)
if status == 'OK':
total_messages = int(messages[0])
print(f"INBOX selected. Total messages: {total_messages}")
else:
print(f"Failed to select INBOX: {messages}")
Amikor kiválaszt egy postafiókot, a szerver visszaadja az abban található üzenetek teljes számát. Minden ezt követő keresési és lekérési parancs erre a kiválasztott postafiókra fog vonatkozni.
E-mailek Keresése és Lekérése
Ez az e-mail lekérés magja. A folyamat két lépésből áll: először, megkeressük azokat az üzeneteket, amelyek megfelelnek bizonyos kritériumoknak, hogy megkapjuk az egyedi azonosítóikat, majd másodszor, lekérjük ezen üzenetek tartalmát az azonosítóik segítségével.
A `search()` Erejéről
A search()
metódus hihetetlenül sokoldalú. Nem magukat az e-maileket adja vissza, hanem az Ön lekérdezésének megfelelő üzenetsorozatszámok (azonosítók) listáját. Ezek az azonosítók az aktuális munkamenetre és a kiválasztott postafiókra specifikusak.
Íme néhány a leggyakoribb keresési kritériumok közül:
'ALL'
: Az összes üzenet a postafiókban.'UNSEEN'
: Azok az üzenetek, amelyeket még nem olvastak el.'SEEN'
: Azok az üzenetek, amelyeket már elolvastak.'FROM "sender@example.com"'
: Üzenetek egy adott feladótól.'TO "recipient@example.com"'
: Üzenetek egy adott címzettnek küldve.'SUBJECT "Your Subject Line"'
: Üzenetek egy adott tárggyal.'BODY "a keyword in the body"'
: Üzenetek, amelyek egy bizonyos sztringet tartalmaznak a törzsben.'SINCE "01-Jan-2024"'
: Egy adott dátumon vagy azután kapott üzenetek.'BEFORE "31-Jan-2024"'
: Egy adott dátum előtt kapott üzenetek.
A kritériumokat kombinálhatja is. Például, hogy megtalálja az összes olvasatlan e-mailt egy adott feladótól egy bizonyos tárggyal, a következőre kell keresnie: '(UNSEEN FROM "alerts@example.com" SUBJECT "System Alert")'
.
Lássuk működés közben:
# Search for all unread emails in the INBOX
status, message_ids = conn.search(None, 'UNSEEN')
if status == 'OK':
# message_ids is a list of byte strings, e.g., [b'1 2 3']
# We need to split it into individual IDs
email_id_list = message_ids[0].split()
if email_id_list:
print(f"Found {len(email_id_list)} unread emails.")
else:
print("No unread emails found.")
else:
print("Search failed.")
E-mail Tartalom Lekérése a `fetch()` Metódussal
Most, hogy megvannak az üzenetazonosítók, használhatja a fetch()
metódust a tényleges e-mail adatok lekérésére. Meg kell adnia, hogy az e-mail mely részeit szeretné lekérni.
'RFC822'
: Ez lekéri a teljes nyers e-mail tartalmat, beleértve az összes fejlécet és törzsrészt. Ez a leggyakoribb és legátfogóbb opció.'BODY[]'
: Az `RFC822` szinonimája.'ENVELOPE'
: Lekéri a kulcsfontosságú fejlécinformációkat, mint a Dátum, Tárgy, Feladó, Címzett és In-Reply-To. Ez gyorsabb, ha csak metaadatokra van szüksége.'BODY[HEADER]'
: Csak a fejléceket kéri le.
Kérjük le az első talált olvasatlan e-mail teljes tartalmát:
if email_id_list:
first_email_id = email_id_list[0]
# Fetch the email data for the given ID
# 'RFC822' is a standard that specifies the format of text messages
status, msg_data = conn.fetch(first_email_id, '(RFC822)')
if status == 'OK':
for response_part in msg_data:
# The fetch command returns a tuple, where the second part is the email content
if isinstance(response_part, tuple):
raw_email = response_part[1]
# Now we have the raw email data as bytes
# The next step is to parse it
print("Successfully fetched an email.")
# We will process `raw_email` in the next section
else:
print("Fetch failed.")
E-mail Tartalom Elemzése az `email` Modullal
A fetch()
által visszaadott nyers adat egy bájt-sztring, amely az RFC 822 szabvány szerint van formázva. Nem könnyen olvasható. A Python beépített email
modulja kifejezetten arra lett tervezve, hogy ezeket a nyers üzeneteket egy felhasználóbarát objektumstruktúrába elemezze.
Egy `Message` Objektum Létrehozása
Az első lépés a nyers bájt-sztring átalakítása egy Message
objektummá az `email.message_from_bytes()` segítségével.
import email
from email.header import decode_header
# Assuming `raw_email` contains the byte data from the fetch command
email_message = email.message_from_bytes(raw_email)
Kulcsinformációk Kinyerése (Fejlécek)
Miután megvan a Message
objektum, hozzáférhet a fejléceihez, mint egy szótárhoz.
# Get subject, from, to, and date
subject = email_message["Subject"]
from_ = email_message["From"]
to_ = email_message["To"]
date_ = email_message["Date"]
# Email headers can contain non-ASCII characters, so we need to decode them
def decode_email_header(header):
decoded_parts = decode_header(header)
header_str = ""
for part, encoding in decoded_parts:
if isinstance(part, bytes):
# If there's an encoding, use it. Otherwise, default to utf-8.
header_str += part.decode(encoding or 'utf-8')
else:
header_str += part
return header_str
subject = decode_email_header(subject)
from_ = decode_email_header(from_)
print(f"Subject: {subject}")
print(f"From: {from_}")
A decode_email_header
segédfüggvény fontos, mert a fejléceket gyakran kódolják a nemzetközi karakterkészletek kezelése érdekében. Ha egyszerűen csak az email_message["Subject"]
-hez fér hozzá, egy zavaró karaktersorozatot tartalmazó sztringet kaphat, ha nem dekódolja megfelelően.
Az E-mail Törzsének és Csatolmányainak Kezelése
A modern e-mailek gyakran „többrészesek” (multipart), ami azt jelenti, hogy a tartalom különböző verzióit tartalmazzák (például egyszerű szöveget és HTML-t), és csatolmányokat is tartalmazhatnak. Végig kell mennünk ezeken a részeken, hogy megtaláljuk, amit keresünk.
A msg.is_multipart()
metódus megmondja, hogy egy e-mail több részből áll-e, és a msg.walk()
egyszerű módot biztosít ezeken való iterálásra.
def process_email_body(msg):
body = ""
attachments = []
if msg.is_multipart():
# Iterate through email parts
for part in msg.walk():
content_type = part.get_content_type()
content_disposition = str(part.get("Content-Disposition"))
try:
# Get the email body
if content_type == "text/plain" and "attachment" not in content_disposition:
payload = part.get_payload(decode=True)
charset = part.get_content_charset() or 'utf-8'
body = payload.decode(charset)
# Get attachments
elif "attachment" in content_disposition:
filename = part.get_filename()
if filename:
# Decode filename if needed
decoded_filename = decode_email_header(filename)
attachments.append({
'filename': decoded_filename,
'data': part.get_payload(decode=True)
})
except Exception as e:
print(f"Error processing part: {e}")
else:
# Not a multipart message, just get the payload
payload = msg.get_payload(decode=True)
charset = msg.get_content_charset() or 'utf-8'
body = payload.decode(charset)
return body, attachments
# Using the function with our fetched message
email_body, email_attachments = process_email_body(email_message)
print("\n--- Email Body ---")
print(email_body)
if email_attachments:
print("\n--- Attachments ---")
for att in email_attachments:
print(f"Filename: {att['filename']}")
# Example of saving an attachment
with open(att['filename'], 'wb') as f:
f.write(att['data'])
print(f"Saved attachment: {att['filename']}")
Ez a funkció intelligensen megkülönbözteti az egyszerű szöveges törzset és a fájlcsatolmányokat az egyes részek Content-Type
és Content-Disposition
fejléceinek vizsgálatával.
Haladó Postafiók Kezelés
Az e-mailek lekérése csak a csata fele. A valódi automatizálás magában foglalja az üzenetek állapotának megváltoztatását a szerveren. A store()
parancs az elsődleges eszköze ehhez.
E-mailek Megjelölése (Olvasott, Olvasatlan, Megcsillagozott)
Hozzáadhat, eltávolíthat vagy lecserélhet jelzőket (flag) egy üzeneten. A leggyakoribb jelző a \Seen
, amely az olvasott/olvasatlan állapotot szabályozza.
- Olvasottként jelölés:
conn.store(msg_id, '+FLAGS', '\Seen')
- Olvasatlanként jelölés:
conn.store(msg_id, '-FLAGS', '\Seen')
- E-mail megjelölése/csillagozása:
conn.store(msg_id, '+FLAGS', '\Flagged')
- Jelölés/csillag eltávolítása:
conn.store(msg_id, '-FLAGS', '\Flagged')
E-mailek Másolása és Áthelyezése
Nincs közvetlen „áthelyezés” parancs az IMAP-ban. Egy e-mail áthelyezése kétlépéses folyamat:
- Másolja az üzenetet a cél postafiókba a
conn.copy()
segítségével. - Jelölje meg az eredeti üzenetet törlésre a
\Deleted
jelzővel.
# Assuming `msg_id` is the ID of the email to move
# 1. Copy to the 'Archive' mailbox
status, _ = conn.copy(msg_id, 'Archive')
if status == 'OK':
print(f"Message {msg_id.decode()} copied to Archive.")
# 2. Mark the original for deletion
conn.store(msg_id, '+FLAGS', '\Deleted')
print(f"Message {msg_id.decode()} marked for deletion.")
E-mailek Végleges Törlése
Egy üzenet \Deleted
jelzővel való megjelölése nem távolítja el azonnal. Egyszerűen elrejti a legtöbb e-mail kliensben. Ahhoz, hogy véglegesen eltávolítsa az aktuálisan kiválasztott postafiókban lévő összes törlésre jelölt üzenetet, meg kell hívnia az expunge()
metódust.
Figyelem: az expunge()
visszafordíthatatlan. Miután meghívták, az adatok végleg elvesznek.
# This will permanently delete all messages with the \Deleted flag
status, response = conn.expunge()
if status == 'OK':
print(f"{len(response)} messages expunged (permanently deleted).")
Az expunge()
egy kulcsfontosságú mellékhatása, hogy újra számozhatja az üzenetazonosítókat a postafiókban lévő összes további üzenet esetében. Emiatt a legjobb, ha azonosítja az összes feldolgozandó üzenetet, elvégzi a műveleteket (mint a másolás és törlésre jelölés), majd a munkamenet legvégén egyszer hívja meg az expunge()
-t.
Mindent Összerakva: Egy Gyakorlati Példa
Készítsünk egy teljes szkriptet, amely egy valós feladatot hajt végre: Átvizsgálja a beérkező leveleket az "invoices@mycorp.com" címről érkező olvasatlan e-mailek után, letölti a PDF csatolmányokat, és áthelyezi a feldolgozott e-mailt egy "Processed-Invoices" nevű postafiókba.
import imaplib
import email
from email.header import decode_header
import os
# --- Configuration ---
EMAIL_ACCOUNT = "your_email@example.com"
APP_PASSWORD = "your_16_digit_app_password"
IMAP_SERVER = "imap.gmail.com"
TARGET_SENDER = "invoices@mycorp.com"
DESTINATION_MAILBOX = "Processed-Invoices"
DOWNLOAD_DIR = "invoices"
# Create download directory if it doesn't exist
if not os.path.isdir(DOWNLOAD_DIR):
os.mkdir(DOWNLOAD_DIR)
def decode_email_header(header):
# (Same function as defined earlier)
decoded_parts = decode_header(header)
header_str = ""
for part, encoding in decoded_parts:
if isinstance(part, bytes):
header_str += part.decode(encoding or 'utf-8')
else:
header_str += part
return header_str
conn = None
try:
# --- Connect and Login ---
conn = imaplib.IMAP4_SSL(IMAP_SERVER)
conn.login(EMAIL_ACCOUNT, APP_PASSWORD)
print("Login successful.")
# --- Select INBOX ---
conn.select('INBOX')
print("INBOX selected.")
# --- Search for emails ---
search_criteria = f'(UNSEEN FROM "{TARGET_SENDER}")'
status, message_ids = conn.search(None, search_criteria)
if status != 'OK':
raise Exception("Search failed")
email_id_list = message_ids[0].split()
if not email_id_list:
print("No new invoices found.")
else:
print(f"Found {len(email_id_list)} new invoices to process.")
# --- Process Each Email ---
for email_id in email_id_list:
print(f"\nProcessing email ID: {email_id.decode()}")
# Fetch the email
status, msg_data = conn.fetch(email_id, '(RFC822)')
if status != 'OK':
print(f"Failed to fetch email ID {email_id.decode()}")
continue
raw_email = msg_data[0][1]
email_message = email.message_from_bytes(raw_email)
subject = decode_email_header(email_message["Subject"])
print(f" Subject: {subject}")
# Look for attachments
for part in email_message.walk():
if part.get_content_maintype() == 'multipart':
continue
if part.get('Content-Disposition') is None:
continue
filename = part.get_filename()
if filename and filename.lower().endswith('.pdf'):
decoded_filename = decode_email_header(filename)
filepath = os.path.join(DOWNLOAD_DIR, decoded_filename)
# Save the attachment
with open(filepath, 'wb') as f:
f.write(part.get_payload(decode=True))
print(f" -> Downloaded attachment: {decoded_filename}")
# --- Move the processed email ---
# 1. Copy to destination mailbox
status, _ = conn.copy(email_id, DESTINATION_MAILBOX)
if status == 'OK':
# 2. Mark original for deletion
conn.store(email_id, '+FLAGS', '\Deleted')
print(f" Email moved to '{DESTINATION_MAILBOX}'.")
# --- Expunge and Clean Up ---
if email_id_list:
conn.expunge()
print("\nExpunged deleted emails.")
except Exception as e:
print(f"An error occurred: {e}")
finally:
if conn:
conn.logout()
print("Logged out.")
Bevált Gyakorlatok és Hibakezelés
Robusztus automatizálási szkriptek készítésekor vegye figyelembe a következő bevált gyakorlatokat:
- Robusztus Hibakezelés: Csomagolja a kódját
try...except
blokkokba, hogy elkapja a lehetséges problémákat, mint például a bejelentkezési hibákat (imaplib.IMAP4.error
), hálózati problémákat vagy elemzési hibákat. - Konfigurációkezelés: Soha ne írja bele a hitelesítő adatokat közvetlenül a kódba. Használjon környezeti változókat (
os.getenv()
), konfigurációs fájlt (pl. INI vagy YAML), vagy egy dedikált titokkezelőt. - Naplózás: A
print()
utasítások helyett használja a Pythonlogging
modulját. Lehetővé teszi a kimenet részletességének szabályozását, fájlokba írást és időbélyegek hozzáadását, ami felbecsülhetetlen értékű a felügyelet nélkül futó szkriptek hibakereséséhez. - Rate Limiting: Legyen jó internetes polgár. Ne kérdezze le az e-mail szervert túlzottan gyakran. Ha gyakran kell ellenőriznie az új leveleket, fontolja meg a több perces időközöket a másodpercek helyett.
- Karakterkódolások: Az e-mail egy globális szabvány, és különféle karakterkódolásokkal fog találkozni. Mindig próbálja meg meghatározni a karakterkészletet az e-mail részből (
part.get_content_charset()
), és legyen egy tartalék megoldása (mint az 'utf-8'), hogy elkerülje a `UnicodeDecodeError` hibát.
Következtetés
Most végigjárta egy e-mail szerverrel való interakció teljes életciklusát a Python imaplib
segítségével. Lefedtük a biztonságos kapcsolat létrehozását, a postafiókok listázását, erőteljes keresések végrehajtását, összetett, többrészes e-mailek lekérését és elemzését, csatolmányok letöltését és az üzenetek állapotának kezelését a szerveren.
Ennek a tudásnak a hatalma óriási. Építhet rendszereket a támogatási jegyek automatikus kategorizálására, napi jelentésekből származó adatok elemzésére, hírlevelek archiválására, riasztási e-mailek alapján történő műveletek indítására és még sok másra. A beérkező levelek, amelyek egykor a kézi munka forrásai voltak, erőteljes, automatizált adatforrássá válhatnak alkalmazásai és munkafolyamatai számára.
Melyik e-mail feladatot fogja először automatizálni? A lehetőségeket csak a képzelete korlátozza. Kezdje kicsiben, építsen az útmutatóban szereplő példákra, és szerezze vissza idejét a beérkező levelek mélyéről.